#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<vector<int> > matrix;
const int P=998244353;
inline int add(int x,int y){
  int s=x+y; if(s>=P)s-=P; return s;
}
inline void self_add(int &x,int y){
  if((x+=y)>=P)x-=P;
}
inline int qpow(int a,ll b){
  int r=1;
  while(b){
    if(b&1)r=1ll*r*a%P;
    a=1ll*a*a%P,b>>=1;
  }
  return r;
}
inline int progress_sum(int a,int k,ll n){
  return n?1ll*a*add(qpow(k,n),P-1)%P*qpow(add(k,P-1),P-2)%P:0;
}
inline matrix operator *(const matrix &a,const matrix &b){
  matrix c(a.size(),vector<int>(b[0].size()));
  for(int i=0;i<a.size();i++)
    for(int j=0;j<a[0].size();j++)
      for(int k=0;k<b[0].size();k++)
        self_add(c[i][k],1ll*a[i][j]*b[j][k]%P);
  return c;
}
int main(){
  freopen("yt.in","r",stdin);
  freopen("yt.out","w",stdout);
  ios::sync_with_stdio(false);
  cin.tie(0); cout.tie(0);
  int n; ll m,mx=0,mn=1e18; cin>>n>>m;
  vector<pair<int,ll> > a(n);
  for(auto &s:a){
    cin>>s.first>>s.second;
    mx=max(mx,s.second),mn=min(mn,s.second);
  }
  if(n==1)cout<<qpow(a[0].first,m)<<endl;
  else if(mx<=300){
    vector<int> f(m+1); f[0]=1;
    for(auto e:a){
      int x,y; tie(x,y)=e;
      vector<int> p(y+1),g(m+1);
      for(int i=p[0]=1;i<=y;i++)
        p[i]=1ll*p[i-1]*x%P;
      for(int i=0;i<=m;i++)
        if(f[i])
          for(int j=0;j<=y&&i+j<=m;j++)
            self_add(g[i+j],1ll*f[i]*p[j]%P);
      f=g;
    }
    cout<<f[m]<<endl;
  }
  else if(n==2){
    int b=qpow(a[1].first,m),k=1ll*a[0].first*qpow(a[1].first,P-2)%P;
    ll l=max(m-a[1].second,0ll),r=min(a[0].second,m);
    cout<<add(progress_sum(b,k,r+1),P-progress_sum(b,k,l))<<endl;
  }
  else if(mn>=m){
    matrix t(n,vector<int>(n));
    for(int i=0;i<n;i++)
      for(int j=i;j<n;j++)
        t[i][j]=a[j].first;
    matrix s(1,vector<int>(n));
    s[0][0]=1;
    while(m){
      if(m&1)s=s*t;
      t=t*t,m>>=1;
    }
    cout<<accumulate(s[0].begin(),s[0].end(),0,add)<<endl;
  }
  return 0;
}